Appearance
《C语言程序设计》第二学期重修试卷A (精选03)
一、选择题(本大题共20小题,每小题2分,共40分)
(1) 以下选项中属于 C 语言的数据类型是
- A) 复数型
- B) 逻辑型
- C) 双精度型
- D) 集合型
查看答案与解析
答案:C
解析: C 语言的基本数据类型包括字符型(char)、整型(int)、单精度浮点型(float)和双精度浮点型(double)。
难度: ⭐
考点: #基本数据类型
💡 学习锦囊
📖 相关公式与知识点:
- 基础数据类型关键字:
char,int,float,double。
思路分析
熟悉基础关键字体系即可迅速判断。
易错点
勿将面向对象特有的 Boolean 等类型代入传统 C 语言基础部分。
🔄 举一反三
- 以下不属于 C 语言基本类型的是( )
- A.
char - B.
string
查看练习答案与解析
答案:B
解析:C 语言内建字符串表示为字符指针或字符数组,并非基础的独立string关键字。 - A.
(2) 在 C 语言中(假设 int 类型为 2 字节),不正确的 int 类型的常数是
- A) 32768
- B) 0
- C) 037
- D) 0xAF
查看答案与解析
答案:A
解析: 当 int 类型为 2 字节(16 位)时,有符号 int 的取值范围为 -32768 到 32767。常数 32768 超出此范围,不是合法的 int 类型常数。B 为十进制 0;C 为八进制 37(十进制 31);D 为十六进制 AF(十进制 175),均在范围内。
注意:在现代 32 位及以上系统中,int 通常为 4 字节,32768 是合法的 int 常数。本题基于 16 位系统环境。
难度: ⭐⭐
考点: #整型常数极限 #数据类型范围
💡 学习锦囊
📖 相关公式与知识点:
- 16 位有符号整型取值:$-2^{15} \sim 2^{15}-1$,即 -32768 ~ 32767。
- 32 位有符号整型取值:$-2^{31} \sim 2^{31}-1$,即约 ±21 亿。
思路分析
对比主流进制字面格式,并校验范围边界。注意题目对 int 字节数的假设。
易错点
- 不同系统环境下 int 的字节数不同,需根据题目假设作答。
🔄 举一反三
- 下列为非法八进制整型字面量的是?
- A.
012 - B.
089
查看练习答案与解析
答案:B
解析:八进制数位仅可使用 0-7。 - A.
(3) 语句:printf("%d", (a=2)&& (b=-2); 的输出结果是
- A) 无输出
- B) 结果不确定
- C) -1
- D) 1
查看答案与解析
答案:D
解析:(a=2) && (b=-2) 两边都获得非零值(逻辑真),交汇产出最终值 1。
难度: ⭐
考点: #逻辑乘积求值
💡 学习锦囊
📖 相关公式与知识点:
- 逻辑真输出均为 1。
易错点
防止混淆最终的复合条件真值与分支内的变量赋值。
🔄 举一反三
0 && 5执行后的求值结果为?查看练习答案与解析
答案:0
(4) 下列描述中不正确的是
A) 字符型数组中可以存放字符串
B) 可以对字符型数组进行整体输入、输出
C) 可以对整型数组进行整体输入、输出
D) 不能在赋值语句中通过赋值运算符"="对字符型数组进行整体赋值
查看答案与解析
答案:C
解析: C 语言不允许像操作单独变量那样宏观操作整型数组集合。
难度: ⭐
考点: #一维整体访问屏蔽
💡 学习锦囊
思路分析
记住唯有字符流支持 %s 整体遍历机制。
🔄 举一反三
- 可以使用
%s直接读入一串整型数吗?查看练习答案与解析
答案:不可以。
(5) 设有如下定义: int $x = 1$ , $y = -1$ ; , 则语句: printf("%d\n", (x--&++y)); 的输出结果是
- A) 1
- B) 0
- C) -1
- D) 2
查看答案与解析
答案:B
解析:x-- 取值为 1;++y 执行后将 y 提升至 0。计算 1 & 0 = 0。
难度: ⭐⭐
考点: #位操作前置区分
💡 学习锦囊
📖 相关公式与知识点:
++x先变后用,x++先用后变。
🔄 举一反三
int x=0; printf("%d", ++x);的输出是?查看练习答案与解析
答案:1
(6) 当 c 的值不为 0 时, 在下列选项中能正确将 c 的值赋给变量 a、b 的是
A) $c = b = a;$
B) $(a = c) \parallel (b = c);$
C) $(a = c) \&\& (b = c);$
D) $a = c = b;$
查看答案与解析
答案:C
解析: 利用逻辑与的延续性规避短路阻滞。
难度: ⭐⭐
考点: #短路阻断控制
💡 学习锦囊
易错点
逻辑或在捕获真值后会截断后续命令。
🔄 举一反三
int a=1; (a=0) && (b=2);之后b的值?查看练习答案与解析
答案:不变。
(7) 以下程序的输出结果是
- A) 10 1 9 2
- B) 9 8 7 6
- C) 10 9 9 0
- D) 10 10 9 1
main() {
int x = 10, y = 10, i;
for (i = 0; x > 8; y = ++i)
printf("%d,%d ", x--, y);
}2
3
4
5
查看答案与解析
答案:D
解析:
- 第一次判断 10 > 8,打印 10 10;x 变为 9,步进
y = ++i(i=1, y=1)。 - 第二次判断 9 > 8,打印 9 1;x 变为 8,步进 i=2, y=2。
- 第三次判断 8 > 8 失败,停止。
难度: ⭐⭐
考点: #变量步进生命期
💡 学习锦囊
📖 相关公式与知识点:
for的步长改变在当前循环体完整结束后被触发。
🔄 举一反三
- 典型
for(i=0;i<2;i++)流程共输出几次?查看练习答案与解析
答案:2次。
(8) 以下程序的输出结果是
- A) 52
- B) 51
- C) 53
- D) 97
main() {
int i, x[3][3] = {9, 8, 7, 6, 5, 4, 3, 2, 1}, *p = &x[1][1];
for (i = 0; i < 4; i += 2)
printf("%d", p[i]);
}2
3
4
5
查看答案与解析
答案:C
解析:p 绑定到 5 的物理空间。p[0] 提取 5;p[2] 获取两个字节偏移量后的 3。
难度: ⭐⭐⭐
考点: #连续地址映射
💡 学习锦囊
📖 相关公式与知识点:
p[i]等同于内存计算公式*(p + i)。
思路分析
将高维结构化映射至一维存储池分析。
🔄 举一反三
- 设
int a[5]={1,2,3,4,5}, *p = a;则*(p+1)的值?查看练习答案与解析
答案:2
(9) 以下程序的输出结果是
- A) 6
- B) 6789
- C) '6'
- D) 789
main() {
char a[10] = {'1', '2', '3', '4', '5', '6', '7', '8', '9', 0}, *p;
int i;
i = 8;
p = a + i;
printf("%s\n", p - 3);
}2
3
4
5
6
7
查看答案与解析
答案:B
解析:p-3 回拨到 5 下标处的字符 '6',继续扫描直至空边界。
难度: ⭐⭐
考点: #字符流读断点
💡 学习锦囊
📖 相关公式与知识点:
%s持续向下搜捕\0。
🔄 举一反三
- 指针偏移向低地址靠拢使用的操作?
查看练习答案与解析
答案:减号运算。
(10) 以下程序的运行结果是
- A) 运行后报错
- B) 66
- C) 612
- D) 55
#include <stdio.h>
main() {
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
int *p = a + 5, *q = NULL;
*q = *(p + 5);
printf("%d%d\n", *p, *q);
}2
3
4
5
6
7
查看答案与解析
答案:A
解析: 尝试使用未关联安全块的空指针对象引发段异常。
难度: ⭐
考点: #异常指针解引用
💡 学习锦囊
易错点
使用指针变量的第一要务是初始化或验证有效性。
🔄 举一反三
- 尝试给
NULL赋值将抛出?查看练习答案与解析
答案:段错误/报错。
(11) 以下说法中正确的是
A) #define 和 printf 都是 C 语句
B) #define 是 C 语句,而 printf 不是
C) printf 是 C 语句,但 #define 不是
D) #define 和 printf 都不是 C 语句
查看答案与解析
答案:D
解析: 预编译指引非控制语句;常规函数非独立控制结构。
难度: ⭐
考点: #语句底层划分
💡 学习锦囊
📖 相关公式与知识点:
- 宏指令在编译开始前就替换完毕。
🔄 举一反三
- 函数调用转化为语句的核心要求?
查看练习答案与解析
答案:追加分号。
(12) 语句:printf("%d\n", 12 &012); 的输出结果是
- A) 12
- B) 8
- C) 6
- D) 012
查看答案与解析
答案:B
解析: 012 被解读为八进制数据 10。位与结算得出 8。
难度: ⭐⭐
考点: #进制交叉运算
💡 学习锦囊
📖 相关公式与知识点:
- 以零开头的表示体系。
🔄 举一反三
011对应的十进制值?查看练习答案与解析
答案:9
(13) 能正确表示 a 和 b 同时为正或同时为负的逻辑表达式是
A) $(a>=0\parallel b>=0) \&\& (a<0\parallel b<0)$
B) $(a>=0\&\&b>=0) \&\& (a<0\&\&b<0)$
C) $(a+b>0) \&\& (a+b<=0)$
D) $a*b>0$
查看答案与解析
答案:D
解析: 数学判定法:同号的积总是大于零的。
难度: ⭐
考点: #代数映射化简
💡 学习锦囊
思路分析
尽可能将分支选择合并到数学运算法则中。
🔄 举一反三
- 判定异号?
查看练习答案与解析
答案:
a*b < 0
(14) 以下程序的输出结果是
- A) 20
- B) 31
- C) 321
- D) 210
main() {
int n = 4;
while (n--)
printf("%d ", --n);
}2
3
4
5
查看答案与解析
答案:A
解析: 循环控制和内部逻辑各自削减,产出阶跃落差 2 0。
难度: ⭐⭐⭐
考点: #嵌套减量分析
💡 学习锦囊
📖 相关公式与知识点:
- 自增自减在当前表达式求值中的更新时机。
🔄 举一反三
n=2; while(n--);结束时n的取值?查看练习答案与解析
答案:-1
(15) 若已定义: int a[9], *p=a; 并在以后的语句中未改变 p 的值, 不能表示 a[1] 地址的表达式是
- A) p + 1
- B) a+1
- C) a++
- D) ++p
查看答案与解析
答案:C
解析: 常数形式地址不可应用位移迭代赋新值。
难度: ⭐
考点: #常量语义属性
💡 学习锦囊
📖 相关公式与知识点:
- 常量左值保护。
🔄 举一反三
- 可以对数组名
a执行scanf吗?查看练习答案与解析
答案:可以,其本身就是地址。
(16) 以下程序的输出结果是
- A) 17, 021, 0x11
- B) 17, 17, 17
- C) 17, 0x11, 021
- D) 17, 21, 11
main() {
int k = 17;
printf("%d, %o, %x\n", k, k, k);
}2
3
4
查看答案与解析
答案:D
解析: 未搭配井号的前导修饰输出。
难度: ⭐
考点: #基础输出配置
💡 学习锦囊
📖 相关公式与知识点:
- 常见的十、八、十六进制控制符。
🔄 举一反三
- 带前缀的输出方法?
查看练习答案与解析
答案:
%#o,%#x
(17) 以下程序的输出结果是
A)-11 B)01 C)10 D)00
#include <stdio.h>
main() {
int a = -1, b = 1;
if (++a < 0 && !(b-- <= 0))
printf("%d%d\n", a, b);
else
printf("%d%d\n", b, a);
}2
3
4
5
6
7
8
查看答案与解析
答案:C
解析:++a(变为0)导致第一个条件分支中断,直接偏向 else。
难度: ⭐⭐
考点: #分支截断
💡 学习锦囊
📖 相关公式与知识点:
- 逻辑与的短路判定。
🔄 举一反三
1 || 0是否会继续计算右侧?查看练习答案与解析
答案:不会。
(18) 若有说明:long *p, a; 则不能通过 scanf 语句正确给输入项读入数据的程序段是
A) $*p = \& a;$ scanf("%ld", p);
B) $p = (long *)malloc(8);$ scanf("%ld", p);
C) scanf("%ld", p = &a);
D) scanf("%ld", &a);
查看答案与解析
答案:A
解析: 错误解引用空地址引发越权冲突。
难度: ⭐⭐⭐
考点: #动态注入合法性
💡 学习锦囊
📖 相关公式与知识点:
- 解引用操作会尝试读写实际关联的存储区。
🔄 举一反三
long *p; scanf("%ld", p);安全吗?查看练习答案与解析
答案:极不安全,野指针。
(19) 若有以下定义和语句: double $r = 99$ *p = &r; *p = r 则以下正确的叙述是
A) 以下两处的 $* p$ 含义相同, 都说明给指针变量 $p$ 赋值
B) 在"double r=99, *p=&r; "中,把 r 的地址赋值给了 p 所指的存储单元
C) 语句 ${}^{*}p = r;$ 把变量 $r$ 的值赋给指针变量 $p$
D) 语句" $^{\ast}\mathrm{p} = \mathrm{r}$ ; "取变量 r 的值放回 r 中
查看答案与解析
答案:D
解析: 解引用即原物理变量别称。
难度: ⭐
考点: #代名词等价
💡 学习锦囊
📖 相关公式与知识点:
- 指针映射法则。
🔄 举一反三
- 改变
*p等同于改变什么?查看练习答案与解析
答案:它当前绑定的变量。
(20) 以下程序的输出结果是
- A) 编译不通过, 无输出
- B) aceg
- C) acegi
- D) abcdefghi
#include <stdio.h>
main() {
int i;
for (i = 'A'; i < 'I'; i++, i++)
printf("%c", i + 32);
printf("\n");
}2
3
4
5
6
7
查看答案与解析
答案:B
解析: 循环跨越,把对应的字符组化为小写形式。
难度: ⭐
考点: #离散区间遍历
💡 学习锦囊
📖 相关公式与知识点:
- ASCII 排列。
🔄 举一反三
'b'和'B'差值?查看练习答案与解析
答案:32
二、填空题(本大题共7空,每空4分,共28分)
(1) 以下程序的功能是: 从键盘上输入若干个学生的成绩, 统计计算出平均成绩,并输出低于平均分的学生成绩, 用输入负数结束输入。请填空。
main() {
float x[1000], sum = 0.0, ave, a;
int n = 0, i;
printf("Enter mark:\n");
scanf("%f", &a);
while (a >= 0.0 && n < 1000) {
sum += (1);
x[n] = (2);
n++;
scanf("%f", &a);
}
ave = (3);
printf("Output:\n");
printf("ave=%f\n", ave);
for (i = 0; i < n; i++)
if (4)
printf("%f\n", x[i]);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查看答案与解析
答案:
- (1)
a - (2)
a - (3)
sum / n - (4)
x[i] < ave
解析:
- 1、2:捕获最新的评分项。
- 3:总和除以样本数获取平均线。
- 4:判断哪一项处于劣势。
难度: ⭐⭐
考点: #综合循环设计
💡 学习锦囊
易错点
不要漏掉变量的每次递增计数。
🔄 举一反三
- 循环累加总计?
查看练习答案与解析
答案:
sum += x;
(2) 以下程序中,主函数调用了 LineMax 函数,实现在 N 行 M 列的二维数组中,找出每一行上的最大值。请填空。
#define N 3
#define M 4
void LineMax(int x[N][M]) {
int i, j, p;
for (i = 0; i < N; i++) {
p = 0;
for (j = 1; j < M; j++)
if (x[i][p] < x[i][j])
(5);
printf("The max value in line %d is %d\n", i, (6));
}
}
main() {
int x[N][M] = {1, 5, 7, 4, 2, 6, 4, 3, 8, 2, 3, 1};
(7);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查看答案与解析
答案:
- (5)
p = j - (6)
x[i][p] - (7)
LineMax(x)
解析:
- 5:更新当前已知最优点指针坐标。
- 6:输出优胜项数值。
- 7:发起业务函数过程。
难度: ⭐⭐
考点: #局部极值追踪
💡 学习锦囊
📖 相关公式与知识点:
- 二维数组参数化匹配。
🔄 举一反三
- 求最小值表达式?
查看练习答案与解析
答案:
if (x[i][p] > x[i][j])
三、阅读程序题(本大题共4小题,每题5分,共20分)
(1) 下列程序的输出结果是
#include <stdio.h>
#include <string.h>
main() {
char b[30], *chp;
strcpy(&b[0], "CH");
strcpy(&b[1], "DEF");
strcpy(&b[2], "ABC");
printf("%s\n", b);
}2
3
4
5
6
7
8
9
查看答案与解析
答案:CDABC
解析: 前置区因越位调用发生了局部重叠修改。
难度: ⭐⭐⭐
考点: #越位重写
💡 学习锦囊
易错点
strcpy 自动覆盖直至空字节结尾。
🔄 举一反三
- 再次执行会覆盖多深?
查看练习答案与解析
答案:依长度确定。
(2) 下列程序的输出结果是
#include <stdio.h>
void t(int x, int y, int cp, int dp) {
cp = x * x + y * y;
dp = x * x - y * y;
}
main() {
int a = 4, b = 3, c = 5, d = 6;
t(a, b, c, d);
printf("%d %d\n", c, d);
}2
3
4
5
6
7
8
9
10
11
12
查看答案与解析
答案:5 6
解析: 副本运算无法反馈给源变量。
难度: ⭐
考点: #隔离生存域
💡 学习锦囊
📖 相关公式与知识点:
- C 语言基础按值传递的隔离屏障。
🔄 举一反三
- 如何影响主调用栈数据?
查看练习答案与解析
答案:改用地址间接操作。
(3) 下列程序中字符串中各单词之间有一个空格, 则程序的输出结果是
#include <string.h>
#include <stdio.h>
main() {
char strl[] = "How do you do", *p1 = strl;
strcpy(strl + strlen(strl) / 2, "es she");
printf("%s\n", p1);
}2
3
4
5
6
7
查看答案与解析
答案:How does she
解析: 从中间的空白点开始重新写入后半部分文本。
难度: ⭐⭐
考点: #偏移合并
💡 学习锦囊
思路分析
准确定位偏移索引。
🔄 举一反三
- 指针平移?
查看练习答案与解析
答案:
str + n
(4) 以下程序的运行结果是
#include <stdio.h>
int func(int a, int b) {
static int m = 0, i = 2;
i += m + 1;
m = i + a + b;
return m;
}
main() {
int k = 4, m = 1, p;
p = func(k, m);
printf("%d", p);
p = func(k, m);
printf("%d\n", p);
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查看答案与解析
答案:817
解析: 静态保留区域使内存得以持续驻留不释放。
难度: ⭐⭐⭐
考点: #驻留内存特性
💡 学习锦囊
📖 相关公式与知识点:
static变量跨越多次调用生命线。
🔄 举一反三
- 初始化重置频率?
查看练习答案与解析
答案:一生一次。
四、 程序题(12分)
- 编写一程序,将字符串中的第 $\mathrm{m}$ 个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及 $\mathrm{m}$ 的值并输出复制结果,在被调用函数中完成复制。试编程。
查看答案与解析
答案:
#include <stdio.h>
void strmcpy(char *s, char *t, int m) {
int i = 0;
while (s[m - 1 + i] != '\0') {
t[i] = s[m - 1 + i];
i++;
}
t[i] = '\0';
}
int main() {
char str1[100], str2[100];
int m;
printf("请输入字符串:");
gets(str1);
printf("请输入起始位置m:");
scanf("%d", &m);
strmcpy(str1, str2, m);
printf("复制结果:%s\n", str2);
return 0;
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
难度: ⭐⭐
考点: #字符串子集提取
💡 学习锦囊
📖 相关公式与知识点:
- 指针迭代逻辑与数组复制。
🔄 举一反三
- 拷贝结束依据?
查看练习答案与解析
答案:读取到
\0。